package com.navinfo.platform.trip.common.arithmetic.logger;

import com.navinfo.platform.trip.common.config.ConfigMap;
import com.navinfo.platform.trip.common.util.CommonUtils;
import org.slf4j.Logger;

import java.util.HashSet;
import java.util.Set;

/**
 * 算法链内部用到的logger,可以对输出logger做定制化
 * @author 沈东生
 */
public class ArithmeticLogger {
    private Logger logger;
    /**
     * 车辆通讯号
     */
    private Long terminalId;
    /**
     * 不受error级别的影响，肯定输出日志的terminalIds，以逗号分隔
     */
    Set<Long> whiteListTerminalIds;

    public ArithmeticLogger(Logger logger) {
        this.logger = logger;
    }


    public long getTerminalId() {
        return terminalId;
    }

    public void setTerminalId(Long terminalId) {
        this.terminalId = terminalId;
    }

    boolean isWhiteList(){
        if(whiteListTerminalIds==null){
            whiteListTerminalIds=new HashSet<>();
            String tids= ConfigMap.getString("logger.whitelist.terminalIds");
            if(CommonUtils.isStrNotEmpty(tids)){
                String[] aryTids=tids.trim().split(",");
                for(String s:aryTids){
                    whiteListTerminalIds.add(Long.valueOf(s.trim()));
                }
            }
        }
        return terminalId!=null&&whiteListTerminalIds.contains(terminalId);
    }

    public void error( String var1, Throwable var2){
        this.errorTid(null,var1,var2);
    }
    public void errorTid(Long tid, String var1, Throwable var2){
        var1=wrapMsg(tid,var1);
        if(isWhiteList()){
            whiteListLog(var1,var2);
        }else{
            logger.error(var1,var2);
        }
    }
    public void error(String var1){
        this.errorTid(null,var1);
    }
    public void errorTid(Long tid,String var1){
        var1=wrapMsg(tid,var1);
        if(isWhiteList()){
            whiteListLog(var1);
        }else{
            logger.error(var1);
        }
    }
    public void error(String var1, Object... var2){
        this.errorTid(null,var1,var2);
    }
    public void errorTid(Long tid,String var1, Object... var2){
        var1=wrapMsg(tid,var1);
        if(isWhiteList()){
            whiteListLog(var1,var2);
        }else{
            logger.error(var1,var2);
        }
    }
    public void info(String var1){
        this.infoTid(null,var1);
    }
    public void infoTid(Long tid,String var1){
        var1=wrapMsg(tid,var1);
        if(isWhiteList()){
            whiteListLog(var1);
        }else{
            logger.info(var1);
        }
    }
    public void info(String var1, Object... var2){
        this.infoTid(null,var1,var2);
    }
    public void infoTid(Long tid,String var1, Object... var2){
        var1=wrapMsg(tid,var1);
        if(isWhiteList()){
            whiteListLog(var1,var2);
        }else{
            logger.info(var1,var2);
        }
    }
    public void debug(String var1, Object... var2){
        debugTid(null,var1,var2);
    }
    public void debugTid(Long tid,String var1, Object... var2){
        var1=wrapMsg(tid,var1);
        if(isWhiteList()){
            whiteListLog(var1,var2);
        }else{
            logger.debug(var1,var2);
        }
    }
    private String wrapMsg(Long tid,String msg){
        if(null == tid){
            tid = this.terminalId;
        }

        if(null != tid) {
            return "[" + tid + "] " + msg;
        }else{
            return msg;
        }
    }


    private void whiteListLog(String var1){
        logger.error(var1);
    }
    /**
     * 这里直接用logger的error级别输出了，后期可以考虑写入kafka等方式
     * @param var1
     * @param var2
     */
    private void whiteListLog( String var1, Throwable var2){
        logger.error(var1,var2);
    }
    public void whiteListLog(String var1, Object... var2){
        logger.error(var1,var2);
    }
}
